package cn.juque.lucenecandy.core.handlers.metaobject.impl;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ReflectUtil;
import cn.juque.lucenecandy.bo.FieldBO;
import cn.juque.lucenecandy.core.enums.DataTypeEnum;
import cn.juque.lucenecandy.core.enums.FieldFillEnum;
import cn.juque.lucenecandy.core.handlers.metaobject.IMetaObject;

import java.util.Date;
import java.util.Objects;
import java.util.Set;

/**
 * @author juque
 * @version 1.0.0
 * <ul>
 *     <li>日期类处理</li>
 * </ul>
 * @date 2024-01-11
 **/
public class DateMetaObject implements IMetaObject {

    /**
     * 具体填充逻辑
     *
     * @param fillEnum 操作
     * @param entity    实体类
     * @param fieldName 变量名称
     * @param fieldBO   变量信息
     */
    @Override
    public void invoke(FieldFillEnum fillEnum, Object entity, String fieldName, FieldBO fieldBO) {
        if (!DataTypeEnum.DATE.getCode().equals(fieldBO.getDataType().getCode()) || Objects.isNull(entity)) {
            return;
        }
        Set<FieldFillEnum> fillEnums = fieldBO.getFills();
        Object value = ReflectUtil.getFieldValue(entity, fieldName);
        if (FieldFillEnum.INSERT.equals(fillEnum)
                && CollUtil.contains(fillEnums, FieldFillEnum.INSERT) && Objects.isNull(value)) {
            ReflectUtil.setFieldValue(entity, fieldName, new Date());
        }
        if (FieldFillEnum.UPDATE.equals(fillEnum) && CollUtil.contains(fillEnums, FieldFillEnum.UPDATE)) {
            ReflectUtil.setFieldValue(entity, fieldName, new Date());
        }
    }
}
